import win32com.client
import pythoncom
import os
import Logger_config

# 设置日志配置
logger = Logger_config.setup_logger()

class WordOpenChecker:
    @staticmethod
    def check_opened_word():
        """
        检测已打开的 Word 文档，返回文档列表（文件名和路径）
        返回值：列表，每个元素为字典 {"name": 文件名, "path": 完整路径}
        """
        try:
            # 尝试获取已运行的 Word 实例
            word = win32com.client.GetActiveObject("Word.Application")
        except:
            # 无打开的 Word 进程时返回空列表
            return []

        open_docs = []
        documents = word.Documents  # 获取所有打开的文档集合

        # 遍历文档集合
        for doc in documents:
            full_path = doc.FullName  # 获取文档完整路径（如 "C:\\Docs\\test.docx"）
            if os.path.exists(full_path):  # 验证路径有效性
                file_name = os.path.basename(full_path)  # 提取文件名（如 "test.docx"）
                open_docs.append({"name": file_name, "path": full_path})

        return open_docs
    @staticmethod
    def close_word_docs(fullpath: list, save_changes: bool = False):
        """
        关闭指定路径的Word文档

        参数:
            fullpath (list): 需要关闭的文档完整路径列表
            save_changes (bool): 是否保存文档修改，默认不保存

        异常处理:
            捕获并记录所有异常，确保COM资源正常释放

        功能流程:
            1. 初始化COM环境
            2. 获取活动Word实例
            3. 遍历文档集合，通过FullName属性精确匹配路径
            4. 对匹配文档执行关闭操作
            5. 退出Word应用并释放资源
        """
        try:
            pythoncom.CoInitialize()  # 多线程COM初始化
            word = win32com.client.GetActiveObject("Word.Application")  # 获取现有实例
            
            # 遍历所有打开的文档
            for doc in word.Documents:
                # 通过FullName属性进行精确路径匹配
                if doc.FullName in fullpath:
                    # 根据参数决定是否保存修改
                    doc.Close(SaveChanges=save_changes)
            
            word.Quit()  # 退出Word应用程序
            
        except Exception as e:
            logger.error(f"操作失败: {e}")  # 记录异常信息
        finally:
            pythoncom.CoUninitialize()  # 释放COM资源

# 主程序
if __name__ == "__main__":
    open_documents = WordOpenChecker.check_opened_word()
    
    if open_documents:
        print("检测到打开的 Word 文档：")
        for idx, doc in enumerate(open_documents, 1):
            print(f"{idx}. 文件名: {doc['name']}")
            print(f"   路径: {doc['path']}")
    else:
        print("当前没有打开的 Word 文档。")

    WordOpenChecker.close_word_docs(r"C:\Users\cheng\Desktop\部门简讯测试\简讯\2025年产业数智化产品部部门简讯-17周-简版.docx")